package com.lckd.ss.util;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.lckd.ss.dto.DTO;
import com.lckd.ss.dto.DTOUtils;
import com.lckd.ss.dto.IDTO;

import java.lang.reflect.Proxy;

/**
 * FastJSON2的工具类
 *
 * @author wm
 * @since 2022/8/3 0003 14:21
 */
public class FastJSON2Utils {

  /**
   * JSON串转对象，支持IDTO接口
   * @param json
   * @param clazz
   * @param <T>
   * @return
   */
  public static <T> T parseObject(String json, Class<T> clazz) {
    if (clazz.isInterface()) {
      if (IDTO.class.isAssignableFrom(clazz)) {
        Class<IDTO> dtoClass = (Class<IDTO>) clazz;
        if (DTOUtils.hasInstance(clazz)) {
          return (T) JSONObject.parseObject(json, DTOUtils.getInstanceClass(dtoClass));
        } else {
          return (T) DTOUtils.proxy(JSON.parseObject(json, DTO.class), dtoClass);
        }
      } else {
        // FastJSON 1的实现方式
        return (T)
            Proxy.newProxyInstance(
                Thread.currentThread().getContextClassLoader(),
                new Class[] {clazz},
                JSON.parseObject(json));
      }
    }else{
      return JSONObject.parseObject(json, clazz);
    }
  }

}
